package ManagedBeans;

import Librerias.Categoria;
import Librerias.Filapedido;
import Librerias.Producto;
import Modulos.moduloCategoria;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.faces.context.FacesContext;

import javax.persistence.*;

@Named(value = "managedBeanProductos")
@SessionScoped
public class ManagedBeanProductos implements Serializable {
    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("Tienda_slorenzoPU");
    private EntityManager em = emf.createEntityManager();
    private ArrayList<Producto> lista = new ArrayList<Producto>();
    private Producto producto;
    
    public ManagedBeanProductos() {  }
    
    public ArrayList<Producto> getLista() {
        return lista;
    }

    public void setLista(ArrayList<Producto> lista) {
        this.lista = lista;
    }
    
    public int numeroProductos(){
        return lista.size();
    }
    
    public void cargarLista(String condicion){
        this.lista.clear();
        Query query;
        String fc = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("categoria");
        if(fc != null && !fc.equals("Todos")){
            int c = Integer.parseInt(fc);
            ManagedBeanCategorias mbc = new ManagedBeanCategorias();
            Categoria cat =  mbc.devolverCategoria(c);
            query = (Query) em.createNamedQuery("Producto.findByIdCategoria");
            query.setParameter("idcategoria", cat);
        }else{
            query = (Query) em.createNamedQuery("Producto.findByNombreAprox");
            query.setParameter("nombre", "%"+condicion+"%");
        }
        
        Collection<Producto> pro = query.getResultList();
        for(Producto p : pro){
            producto = new Producto();
            producto.setId(p.getId());
            producto.setNombre(p.getNombre());
            producto.setDescripcion(p.getDescripcion());
            producto.setIdcategoria(p.getIdcategoria());
            producto.setImagen(p.getImagen());
            producto.setPrecio(p.getPrecio());
            producto.setStock(p.getStock());
            this.getLista().add(producto);
        }
    }
    
    public void cargarLista(String nombre, int categoria, int precio){
        this.lista.clear();
        Categoria c;
        
        Query query = em.createNamedQuery("Categoria.findById");
        query.setParameter("id", categoria);
        c = (Categoria) query.getSingleResult();
        
        int precioMin = 0, precioMax = 0;
        
        switch (precio){
            case -1:
                precioMax=999999999;
                precioMin=0;
            case 1: 
                precioMax=10;
            break;
            case 2: 
                precioMin=10;
                precioMax=20;
            break;
            case 3: 
                precioMin=20;
                precioMax=50;
            break;
            case 4: 
                precioMin=50;
                precioMax=100;
            break;
            case 5: 
                precioMin=100;
                precioMax=20;
            break;
            case 6: 
                precioMin=200;
                precioMax=300;
            break;
            case 7: 
                precioMin=300;
                precioMax=500;
            break;
            case 8: 
                precioMin=500;
                precioMax=1000;
            break;
            case 9: 
                precioMin=1000;
            break;
        }
        System.err.println("Precio: " + precio);
        System.err.println("Precio minimo: " +precioMin);
        System.err.println("Precio Maximo: " + precioMax);
        
        query = em.createNamedQuery("Producto.findByNombreCategoriaPrecio");
        query.setParameter("nombre", "%" + nombre + "%");
        query.setParameter("idcategoria", c);
        query.setParameter("precioMax", precioMax);
        query.setParameter("precioMin", precioMin);
        
        System.out.println(query.toString());
        
        Collection<Producto> pro = query.getResultList();
        for(Producto p : pro){
            producto = new Producto();
            producto.setId(p.getId());
            producto.setNombre(p.getNombre());
            producto.setDescripcion(p.getDescripcion());
            producto.setIdcategoria(p.getIdcategoria());
            producto.setImagen(p.getImagen());
            producto.setPrecio(p.getPrecio());
            producto.setStock(p.getStock());
            this.getLista().add(producto);
        }
    }
       
    public void limpiarLista(){
        this.lista.clear();
    }
        
    public void cargarProducto(){
        Query query;
        this.lista.clear();
        String c = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("producto");
        if (c != null){
            int idProducto = Integer.parseInt(c);        
            query = (Query) em.createNamedQuery("Producto.findById");
            query.setParameter("id", idProducto);
            Collection<Producto> pro = query.getResultList();
            for(Producto p : pro){
                producto = new Producto();
                producto.setId(p.getId());
                producto.setNombre(p.getNombre());
                producto.setDescripcion(p.getDescripcion());
                producto.setIdcategoria(p.getIdcategoria());
                producto.setImagen(p.getImagen());
                producto.setPrecio(p.getPrecio());
                producto.setStock(p.getStock());
                this.getLista().add(producto);
            }
        }
    }
    
    public String guardar(){
        Iterator it = lista.iterator();
        while(it.hasNext()){
            Producto p = (Producto) it.next();
            Producto p2 = em.find(Producto.class, p.getId());
            p2.setNombre(p.getNombre());
            p2.setDescripcion(p.getDescripcion());
            p2.setImagen(p.getImagen());
            p2.setStock(p.getStock());
            p2.setPrecio(p.getPrecio());
            em.merge(p2);
        }
        return "volver";
    }
    
    public String eliminarProducto(){
        Iterator it = lista.iterator();
        while(it.hasNext()){
            Producto p = (Producto) it.next();
            Producto p2 = em.find(Producto.class, p.getId());
            em.getTransaction().begin();
            em.remove(p2);
            em.getTransaction().commit();
        }
        return "volver";
    } 
    public void listarPedido(){
        this.lista.clear();
        
        ManagedBeanFilaPedido mbf = new ManagedBeanFilaPedido();
        ArrayList<Filapedido> listaPedido = mbf.cargarPedido();
        Iterator it = listaPedido.iterator();
        
        while(it.hasNext()){
            Filapedido fp = (Filapedido) it.next();
            Query query;
            Producto p = fp.getIdproducto();
            int idProducto = p.getId();
            Producto p2 = em.find(Producto.class, idProducto);
            
            query = (Query) em.createNamedQuery("Producto.findById");
            query.setParameter("id", idProducto);
            Collection<Producto> pro = query.getResultList();
            for(Producto pr : pro){
                producto = new Producto();
                producto.setId(pr.getId());
                producto.setNombre(pr.getNombre());
                producto.setDescripcion(pr.getDescripcion());
                producto.setIdcategoria(pr.getIdcategoria());
                producto.setImagen(pr.getImagen());
                producto.setPrecio(pr.getPrecio());
                producto.setStock(pr.getStock());
                this.getLista().add(producto);
            }
        }
    }
 
    public void crearProducto(java.lang.String nombre, java.lang.String descripcion, Double precio, int stock, java.lang.String imagen, int idCat) {
        
        
        Categoria c = em.find(Categoria.class, idCat);
        em.getTransaction().begin();
        Producto pro = new Producto();
        pro.setId(100);
        pro.setIdcategoria(c);
        pro.setNombre(nombre);
        pro.setDescripcion(descripcion);
        pro.setPrecio(precio);
        pro.setStock(stock);
        pro.setImagen(imagen);
        em.persist(pro);
        em.getTransaction().commit();  
    }
    
    public int tamañoPedido(){
        return lista.size();
    }
    
    public void restarStock(Producto p, int stock){
        Producto p2 = em.find(Producto.class, p.getId());
        
        em.getTransaction().begin();
        p2.setStock(p.getStock()-stock);
        em.merge(p2);
        em.getTransaction().commit();
    }
    
    public boolean hayStock(int stock){
        if (stock >= 1){
            return true;
        }else{
            return false;
        }
    }
}
